
package example.registerbean;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestMain {
	public static void main(String[] args) {
		// 这是第一种方式，直接使用配置类以及注解来加载所有需要被扫描的类
		//one();

		//第二种方式是先只是初始化spring环境，然后再将配置类注册进去
		//two();

		// 第三种方式是注册单个bean
		//three();

		//第四种方式是自己调用scan方法
		//four();
	}

	private static void four() {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext();
		context.scan("example.registerbean");
		//使用这种方式需要自己手动刷新
		context.refresh();
		//手动使用包扫描的方式只能扫描到哪些加了@Component类型的注解的类
		//ClassWithoutComponent bean = context.getBean(ClassWithoutComponent.class);
		ClassWithComponent bean2 = context.getBean(ClassWithComponent.class);
		//bean.out();
		bean2.out();
	}

	private static void three() {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext();
		// 上面两种方式都是注册的配置类，使用配置类的时候springbean的实例化实际上是分类两步
		//第一步就是使用@Component类型的注解来声明一个bean，第二步就是在配置类中使用@ComponentScan来扫描这些注解
		//而注册单个bean的方式可以不用加上@Component注解，也不需要进行扫描
		context.register(ClassWithoutComponent.class);
		//使用这种方式需要自己手动刷新
		context.refresh();
		ClassWithoutComponent bean = context.getBean(ClassWithoutComponent.class);
		bean.out();
	}

	private static void two() {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext();
		//注册bean实际上只是将bean放入到一个map中
		context.register(RegisterBeanAppConfig.class);
		//使用这种方式需要自己手动刷新，而refresh实际上就是实例化已经注册过的bean
		context.refresh();
		ClassWithComponent classWithComponent = (ClassWithComponent) context.getBean("classWithComponent");
		classWithComponent.out();
	}

	private static void one() {
		AnnotationConfigApplicationContext context =
				new AnnotationConfigApplicationContext(RegisterBeanAppConfig.class);
		ClassWithComponent classWithComponent = (ClassWithComponent) context.getBean("classWithComponent");
		classWithComponent.out();
	}
}
